<!doctype html>
<html lang="en" class="no-js">

  <!-- Mirrored from flatbuffers.dev/internals/ by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 08 May 2025 07:01:36 GMT -->
  <!-- Added by HTTrack --><meta http-equiv="content-type"
    content="text/html;charset=utf-8" /><!-- /Added by HTTrack -->
  <head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">

    <link rel="canonical" href="index.html">

    <link rel="prev" href="../white_paper/index.html">

    <link rel="next" href="../intermediate_representation/index.html">

    <link rel="icon" href="../assets/images/favicon.png">
    <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.9">

    <title>FlatBuffers Internals - FlatBuffers Docs （文档）</title>

    <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css">

    <link rel="stylesheet"
      href="../assets/stylesheets/palette.06af60db.min.css">

    <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
    <link rel="stylesheet"
      href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&amp;display=fallback">
    <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>

    <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>

  </head>

  <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo"
    data-md-color-accent="indigo">

    <input class="md-toggle" data-md-toggle="drawer" type="checkbox"
      id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox"
      id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">

      <a href="#flatbuffers_internals" class="md-skip">
        跳转到内容
      </a>

    </div>
    <div data-md-component="announce">

    </div>

    <header class="md-header md-header--shadow" data-md-component="header">
      <nav class="md-header__inner md-grid" aria-label="Header">
        <a href="../index.html" title="FlatBuffers Docs （文档）"
          class="md-header__button md-logo" aria-label="FlatBuffers Docs （文档）"
          data-md-component="logo">

          <img src="../assets/flatbuffers_logo.svg" alt="logo">

        </a>
        <label class="md-header__button md-icon" for="__drawer">

          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path
              d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z" /></svg>
        </label>
        <div class="md-header__title" data-md-component="header-title">
          <div class="md-header__ellipsis">
            <div class="md-header__topic">
              <span class="md-ellipsis">
                FlatBuffers Docs （文档）
              </span>
            </div>
            <div class="md-header__topic" data-md-component="header-topic">
              <span class="md-ellipsis">

                FlatBuffers Internals（内部结构）

              </span>
            </div>
          </div>
        </div>

        <form class="md-header__option" data-md-component="palette">

          <input class="md-option" data-md-color-media
            data-md-color-scheme="default" data-md-color-primary="indigo"
            data-md-color-accent="indigo" aria-label="Switch to dark mode"
            type="radio" name="__palette" id="__palette_0">

          <label class="md-header__button md-icon" title="Switch to dark mode"
            for="__palette_1" hidden>
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path
                d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z" /></svg>
          </label>

          <input class="md-option" data-md-color-media
            data-md-color-scheme="slate" data-md-color-primary="indigo"
            data-md-color-accent="indigo" aria-label="Switch to light mode"
            type="radio" name="__palette" id="__palette_1">

          <label class="md-header__button md-icon" title="Switch to light mode"
            for="__palette_0" hidden>
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path
                d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z" /></svg>
          </label>

        </form>

        <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>

        <div class="md-header__source">
          <a href="https://github.com/google/flatbuffers"
            title="Go to repository" class="md-source"
            data-md-component="source">
            <div class="md-source__icon md-icon">

              <svg xmlns="http://www.w3.org/2000/svg"
                viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path
                  d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" /></svg>
            </div>
            <div class="md-source__repository">
              google/FlatBuffers
            </div>
          </a>
        </div>

      </nav>

    </header>

    <div class="md-container" data-md-component="container">

      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">

          <div class="md-sidebar md-sidebar--primary"
            data-md-component="sidebar" data-md-type="navigation">
            <div class="md-sidebar__scrollwrap">
              <div class="md-sidebar__inner">

                <nav class="md-nav md-nav--primary" aria-label="Navigation"
                  data-md-level="0">
                  <label class="md-nav__title" for="__drawer">
                    <a href="../index.html" title="FlatBuffers Docs （文档）"
                      class="md-nav__button md-logo"
                      aria-label="FlatBuffers Docs （文档）"
                      data-md-component="logo">

                      <img src="../assets/flatbuffers_logo.svg" alt="logo">

                    </a>
                    FlatBuffers Docs （文档）
                  </label>

                  <div class="md-nav__source">
                    <a href="https://github.com/google/flatbuffers"
                      title="Go to repository" class="md-source"
                      data-md-component="source">
                      <div class="md-source__icon md-icon">

                        <svg xmlns="http://www.w3.org/2000/svg"
                          viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path
                            d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" /></svg>
                      </div>
                      <div class="md-source__repository">
                        google/FlatBuffers
                      </div>
                    </a>
                  </div>

                  <ul class="md-nav__list" data-md-scrollfix>

                    <li class="md-nav__item">
                      <a href="../index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          Overview（概述）

                        </span>

                      </a>
                    </li>

                    <li class="md-nav__item">
                      <a href="../quick_start/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          Quick Start（快速入门）

                        </span>

                      </a>
                    </li>

                    <li class="md-nav__item">
                      <a href="../tutorial/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          Tutorial（教程）

                        </span>

                      </a>
                    </li>

                    <li class="md-nav__item md-nav__item--nested">

                      <input
                        class="md-nav__toggle md-toggle md-toggle--indeterminate"
                        type="checkbox" id="__nav_4">

                      <label class="md-nav__link" for="__nav_4"
                        id="__nav_4_label" tabindex="0">

                        <span class="md-ellipsis">
                          Compiler (flatc)（编译器）

                        </span>

                        <span class="md-nav__icon md-icon"></span>
                      </label>

                      <nav class="md-nav" data-md-level="1"
                        aria-labelledby="__nav_4_label" aria-expanded="false">
                        <label class="md-nav__title" for="__nav_4">
                          <span class="md-nav__icon md-icon"></span>
                          Compiler (flatc)
                        </label>
                        <ul class="md-nav__list" data-md-scrollfix>

                          <li class="md-nav__item">
                            <a href="../building/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Building（构建）

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../flatc/index.html" class="md-nav__link">

                              <span class="md-ellipsis">
                                Using（使用）

                              </span>

                            </a>
                          </li>

                        </ul>
                      </nav>

                    </li>

                    <li class="md-nav__item md-nav__item--nested">

                      <input
                        class="md-nav__toggle md-toggle md-toggle--indeterminate"
                        type="checkbox" id="__nav_5">

                      <label class="md-nav__link" for="__nav_5"
                        id="__nav_5_label" tabindex="0">

                        <span class="md-ellipsis">
                          Schema (.fbs)（模式定义）

                        </span>

                        <span class="md-nav__icon md-icon"></span>
                      </label>

                      <nav class="md-nav" data-md-level="1"
                        aria-labelledby="__nav_5_label" aria-expanded="false">
                        <label class="md-nav__title" for="__nav_5">
                          <span class="md-nav__icon md-icon"></span>
                          Schema (.fbs)
                        </label>
                        <ul class="md-nav__list" data-md-scrollfix>

                          <li class="md-nav__item">
                            <a href="../schema/index.html" class="md-nav__link">

                              <span class="md-ellipsis">
                                Overview（概述）

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../evolution/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Evolution（演变）

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../grammar/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Grammar（语法）

                              </span>

                            </a>
                          </li>

                        </ul>
                      </nav>

                    </li>

                    <li class="md-nav__item md-nav__item--nested">

                      <input
                        class="md-nav__toggle md-toggle md-toggle--indeterminate"
                        type="checkbox" id="__nav_6">

                      <label class="md-nav__link" for="__nav_6"
                        id="__nav_6_label" tabindex="0">

                        <span class="md-ellipsis">
                          Language Guides（语言指南）

                        </span>

                        <span class="md-nav__icon md-icon"></span>
                      </label>

                      <nav class="md-nav" data-md-level="1"
                        aria-labelledby="__nav_6_label" aria-expanded="false">
                        <label class="md-nav__title" for="__nav_6">
                          <span class="md-nav__icon md-icon"></span>
                          Language Guides
                        </label>
                        <ul class="md-nav__list" data-md-scrollfix>

                          <li class="md-nav__item">
                            <a href="../languages/c/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                C

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/cpp/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                C++

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/c_sharp/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                C#

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/dart/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Dart

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/go/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Go

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/java/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Java

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/javascript/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                JavasScript

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/kotlin/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Kotlin

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/lobster/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Lobster

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/lua/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Lua

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/php/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                PHP

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/python/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Python

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/rust/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Rust

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/swift/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Swift

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../languages/typescript/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                TypeScript

                              </span>

                            </a>
                          </li>

                        </ul>
                      </nav>

                    </li>

                    <li class="md-nav__item">
                      <a href="../support/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          Supported Configurations（支持的配置）

                        </span>

                      </a>
                    </li>

                    <li class="md-nav__item">
                      <a href="../white_paper/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          White Paper（白皮书）

                        </span>

                      </a>
                    </li>

                    <li
                      class="md-nav__item md-nav__item--active md-nav__item--nested">

                      <input class="md-nav__toggle md-toggle " type="checkbox"
                        id="__nav_9" checked>

                      <label class="md-nav__link" for="__nav_9"
                        id="__nav_9_label" tabindex="0">

                        <span class="md-ellipsis">
                          Advanced（高级）

                        </span>

                        <span class="md-nav__icon md-icon"></span>
                      </label>

                      <nav class="md-nav" data-md-level="1"
                        aria-labelledby="__nav_9_label" aria-expanded="true">
                        <label class="md-nav__title" for="__nav_9">
                          <span class="md-nav__icon md-icon"></span>
                          Advanced
                        </label>
                        <ul class="md-nav__list" data-md-scrollfix>

                          <li class="md-nav__item md-nav__item--active">

                            <input class="md-nav__toggle md-toggle"
                              type="checkbox" id="__toc">

                            <label class="md-nav__link md-nav__link--active"
                              for="__toc">

                              <span class="md-ellipsis">
                                FlatBuffers Internals（内部结构）

                              </span>

                              <span class="md-nav__icon md-icon"></span>
                            </label>

                            <a href="index.html"
                              class="md-nav__link md-nav__link--active">

                              <span class="md-ellipsis">
                                FlatBuffers Internals（内部结构）

                              </span>

                            </a>

                            <nav class="md-nav md-nav--secondary"
                              aria-label="Table of contents">

                              <label class="md-nav__title" for="__toc">
                                <span class="md-nav__icon md-icon"></span>
                                Table of contents
                              </label>
                              <ul class="md-nav__list" data-md-component="toc"
                                data-md-scrollfix>

                                <li class="md-nav__item">
                                  <a href="#format-components"
                                    class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Format components
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#format-identification"
                                    class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Format identification
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#offsets" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Offsets
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#structs" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Structs
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#tables" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Tables
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#unions" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Unions
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#strings-and-vectors"
                                    class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Strings and Vectors
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#construction" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Construction
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#code-example" class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Code example
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#encoding-example"
                                    class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Encoding example.
                                    </span>
                                  </a>

                                </li>

                                <li class="md-nav__item">
                                  <a href="#additional-reading"
                                    class="md-nav__link">
                                    <span class="md-ellipsis">
                                      Additional reading.
                                    </span>
                                  </a>

                                </li>

                              </ul>

                            </nav>

                          </li>

                          <li class="md-nav__item">
                            <a href="../intermediate_representation/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Intermediate Representation（中间表示）

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../annotation/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Annotating Buffers (.afb)

                              </span>

                            </a>
                          </li>

                          <li class="md-nav__item">
                            <a href="../benchmarks/index.html"
                              class="md-nav__link">

                              <span class="md-ellipsis">
                                Benchmarks（基准测试）

                              </span>

                            </a>
                          </li>

                        </ul>
                      </nav>

                    </li>

                    <li class="md-nav__item">
                      <a href="../flexbuffers/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          FlexBuffers (Schema-less version)（无模式版本）

                        </span>

                      </a>
                    </li>

                    <li class="md-nav__item">
                      <a href="../contributing/index.html" class="md-nav__link">

                        <span class="md-ellipsis">
                          Contributing（贡献）

                        </span>

                      </a>
                    </li>

                  </ul>
                </nav>
              </div>
            </div>
          </div>

          <div class="md-sidebar md-sidebar--secondary"
            data-md-component="sidebar" data-md-type="toc">
            <div class="md-sidebar__scrollwrap">
              <div class="md-sidebar__inner">

                <nav class="md-nav md-nav--secondary"
                  aria-label="Table of contents">

                  <label class="md-nav__title" for="__toc">
                    <span class="md-nav__icon md-icon"></span>
                    Table of contents
                  </label>
                  <ul class="md-nav__list" data-md-component="toc"
                    data-md-scrollfix>

                    <li class="md-nav__item">
                      <a href="#format-components" class="md-nav__link">
                        <span class="md-ellipsis">
                          Format components
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#format-identification" class="md-nav__link">
                        <span class="md-ellipsis">
                          Format identification
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#offsets" class="md-nav__link">
                        <span class="md-ellipsis">
                          Offsets
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#structs" class="md-nav__link">
                        <span class="md-ellipsis">
                          Structs
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#tables" class="md-nav__link">
                        <span class="md-ellipsis">
                          Tables
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#unions" class="md-nav__link">
                        <span class="md-ellipsis">
                          Unions
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#strings-and-vectors" class="md-nav__link">
                        <span class="md-ellipsis">
                          Strings and Vectors
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#construction" class="md-nav__link">
                        <span class="md-ellipsis">
                          Construction
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#code-example" class="md-nav__link">
                        <span class="md-ellipsis">
                          Code example
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#encoding-example" class="md-nav__link">
                        <span class="md-ellipsis">
                          Encoding example.
                        </span>
                      </a>

                    </li>

                    <li class="md-nav__item">
                      <a href="#additional-reading" class="md-nav__link">
                        <span class="md-ellipsis">
                          Additional reading.
                        </span>
                      </a>

                    </li>

                  </ul>

                </nav>
              </div>
            </div>
          </div>

          <div class="md-content" data-md-component="content">
            <article class="md-content__inner md-typeset">

              <a
                href="https://github.com/google/flatbuffers/edit/master/docs/source/internals.md"
                title="Edit this page" class="md-content__button md-icon">

                <svg xmlns="http://www.w3.org/2000/svg"
                  viewBox="0 0 24 24"><path
                    d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z" /></svg>
              </a>

              <h1 id="flatbuffers_internals">FlatBuffers内部结构</h1>
              <p>本节内容对于FlatBuffers的使用来说完全是可选的。在正常使用过程中，您永远不需要了解此处包含的信息。但如果您有兴趣深入了解，它将帮助您更好地理解为什么FlatBuffers既高效又便捷。</p>
              <h3 id="format-components">格式组件（Format components）</h3>
              <p>FlatBuffer是一种二进制文件和内存格式，主要由各种大小的标量组成，每个标量都与自身大小对齐。每个标量始终以小端格式表示，因为这与当今所有常用的CPU相对应。FlatBuffers在大端机器上也能工作，但由于需要额外的字节交换指令，因此会稍微慢一些。</p>
              <p>为确保跨平台互操作性，假定满足以下条件：
                - 浮点数使用二进制<code>IEEE-754</code>格式。
                - 有符号整数使用<code>二进制补码</code>表示。
                - 浮点数和整数的字节序相同。</p>
              <p>这种格式有意不定义内存中对象的确切位置，例如表中的字段可以有任意顺序，对象在一定程度上可以以多种顺序存储。这是因为格式本身不需要这些信息就能高效运行，它为优化和扩展留出了空间（例如，可以以最紧凑的方式打包字段）。相反，格式仅根据偏移量和相邻性定义。这意味着两个不同的实现可能会在给定相同输入值的情况下生成不同的二进制数据，这是完全有效的。</p>
              <h3 id="format-identification">格式标识（Format identification）</h3>
              <p>该格式也不包含用于格式识别和版本控制的信息，这也是有意为之。FlatBuffers是一个静态类型系统，这意味着缓冲区的用户需要知道它是什么类型的缓冲区。当然，必要时可以将FlatBuffers包装在其他容器中，或者使用其联合（union）功能动态识别存储的多个可能子对象。此外，如果需要完整的反射功能，可以将其与模式解析器一起使用。</p>
              <p>版本控制是格式本身的固有部分（字段的可选性/可扩展性），因此格式本身不需要版本号（在某种意义上它是一种元格式）。我们希望这种格式能够容纳所有需要的数据。如果将来必须进行格式破坏性更改，它将成为一种新的格式类型，而不仅仅是变体。</p>
              <h3 id="offsets">偏移量（Offsets）</h3>
              <p>最重要和通用的偏移量类型（见<code>flatbuffers.h</code>）是<code>uoffset_t</code>，它目前始终是<code>uint32_t</code>，用于引用所有表/联合/字符串/向量（这些从不内联存储）。选择32位是有意为之，因为我们希望在32位和64位系统之间保持二进制兼容性，而64位偏移量会使几乎所有用途的大小膨胀。需要时，可以轻松设置具有64位（或16位）偏移量的格式版本。无符号意味着它们只能指向一个方向，通常是向前（朝向更高的内存位置）。任何向后偏移量都将被明确标记。</p>
              <p>格式以<code>uoffset_t</code>开始，指向缓冲区中的根表。</p>
              <p>我们有两种对象：结构体和表。</p>
              <h3 id="structs">结构体（Structs）</h3>
              <p>这些是最简单的，并且如前所述，它们旨在为简单数据提供额外的效率，而不需要版本控制/可扩展性。它们总是存储在父级（结构体、表或向量）中，以实现最大紧凑性。结构体定义了一致的内存布局，其中所有组件都与它们的大小对齐，并且结构体与它们最大的标量成员对齐。这是独立于底层编译器的对齐规则来保证跨平台兼容布局。这种布局然后在生成的代码中强制执行。</p>
              <h3 id="tables">表（Tables）</h3>
              <p>与结构体不同，这些不是内联存储在其父级中，而是通过偏移量引用。</p>
              <p>它们以<code>soffset_t</code>开始，指向一个虚表（vtable）。这是<code>uoffset_t</code>的有符号版本，因为虚表可以存储在相对于对象的任何位置。这个偏移量从对象开始处减去（而不是加上）以到达虚表的开始。这个偏移量后面是所有字段，作为对齐的标量（或偏移量）。与结构体不同，并非所有字段都需要存在。没有固定的顺序和布局。如果用户显式地两次序列化相同的偏移量，表可能包含指向相同值的字段偏移量。</p>
              <p>为了能够访问字段而不考虑这些不确定性，我们通过偏移量的虚表进行处理。虚表在任何恰好具有相同虚表值的对象之间共享。</p>
              <p>虚表的元素都是<code>voffset_t</code>类型，即<code>uint16_t</code>。第一个元素是虚表的大小（以字节为单位），包括大小元素本身。第二个是对象的大小（以字节为单位，包括虚表偏移量）。该大小可用于流式处理，以了解需要读取多少字节才能访问对象的所有<em>内联</em>字段。剩余元素是N个偏移量，其中N是在构建此缓冲区的代码编译时在模式中声明的字段数量（因此，表的大小为N
                + 2）。</p>
              <p>表的生成代码中的所有访问器函数都包含到此表的偏移量作为常量。将此偏移量与第一个字段（元素数量）进行检查，以防止较新的代码读取较旧的数据。如果此偏移量超出范围，或虚表条目为0，则表示该字段在此对象中不存在，将返回默认值。否则，该条目用作读取字段的偏移量。</p>
              <h3 id="unions">联合（Unions）</h3>
              <p>联合体被编码为两个字段的组合：一个表示联合选择的枚举和指向实际元素的偏移量。FlatBuffers保留枚举常量<code>NONE</code>（编码为0）表示未设置联合字段。</p>
              <h3 id="strings-and-vectors">字符串和向量（Strings and Vectors）</h3>
              <p>字符串只是一个字节向量，并且始终以空字符结尾。向量存储为连续对齐的标量元素，前缀为32位元素计数（不包括任何空终止符）。这两者都不内联存储在其父级中，而是通过偏移量引用。如果用户显式地两次序列化相同的偏移量，向量可能包含指向相同值的多个偏移量。</p>
              <h3 id="construction">构造（Construction）</h3>
              <p>当前的实现从后向前构建这些缓冲区（从缓冲区的最高内存地址开始），因为这显著减少了记账的数量并简化了构造API。</p>
              <h3 id="code-example">代码示例（Code example）</h3>
              <p>以下是为<code>samples/monster.fbs</code>生成的代码示例。下面是整个文件，按注释分解：</p>
              <div
                class="highlight"><pre><span></span><code>// automatically generated, do not modify

#include &quot;flatbuffers/flatbuffers.h&quot;

namespace MyGame {
namespace Sample {
</code></pre></div>
              <p>嵌套命名空间支持。</p>
              <div class="highlight"><pre><span></span><code>enum {
  Color_Red = 0,
  Color_Green = 1,
  Color_Blue = 2,
};

inline const char **EnumNamesColor() {
  static const char *names[] = { &quot;Red&quot;, &quot;Green&quot;, &quot;Blue&quot;, nullptr };
  return names;
}

inline const char *EnumNameColor(int e) { return EnumNamesColor()[e]; }
</code></pre></div>
              <p>枚举和便捷的反向查找。</p>
              <div class="highlight"><pre><span></span><code>enum {
  Any_NONE = 0,
  Any_Monster = 1,
};

inline const char **EnumNamesAny() {
  static const char *names[] = { &quot;NONE&quot;, &quot;Monster&quot;, nullptr };
  return names;
}

inline const char *EnumNameAny(int e) { return EnumNamesAny()[e]; }
</code></pre></div>
              <p>联合体与枚举有很多共同点。</p>
              <div class="highlight"><pre><span></span><code>struct Vec3;
struct Monster;
</code></pre></div>
              <p>预声明所有数据类型，因为类型之间允许循环引用（但对象之间不允许循环引用）。</p>
              <div
                class="highlight"><pre><span></span><code>FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vec3 {
 private:
  float x_;
  float y_;
  float z_;

 public:
  Vec3(float x, float y, float z)
    : x_(flatbuffers::EndianScalar(x)), y_(flatbuffers::EndianScalar(y)), z_(flatbuffers::EndianScalar(z)) {}

  float x() const { return flatbuffers::EndianScalar(x_); }
  float y() const { return flatbuffers::EndianScalar(y_); }
  float z() const { return flatbuffers::EndianScalar(z_); }
};
FLATBUFFERS_STRUCT_END(Vec3, 12);
</code></pre></div>
              <p>这些宏做了几件事：它们关闭编译器通常可能执行的任何填充，因为我们手动添加填充（尽管在此示例中没有），并且它们强制执行FlatBuffers选择的对齐方式。这确保了无论编译器和平台如何，该结构体的布局看起来都会相同。请注意，字段是私有的：这是因为它们存储小端序标量，与平台无关（因为这是序列化数据的一部分）。<code>EndianScalar</code>然后执行来回转换，在所有当前的移动和桌面平台上这是一个无操作，在少数仍存在的大端平台上只是一条机器指令。</p>
              <div
                class="highlight"><pre><span></span><code>struct Monster : private flatbuffers::Table {
  const Vec3 *pos() const { return GetStruct&lt;const Vec3 *&gt;(4); }
  int16_t mana() const { return GetField&lt;int16_t&gt;(6, 150); }
  int16_t hp() const { return GetField&lt;int16_t&gt;(8, 100); }
  const flatbuffers::String *name() const { return GetPointer&lt;const flatbuffers::String *&gt;(10); }
  const flatbuffers::Vector&lt;uint8_t&gt; *inventory() const { return GetPointer&lt;const flatbuffers::Vector&lt;uint8_t&gt; *&gt;(14); }
  int8_t color() const { return GetField&lt;int8_t&gt;(16, 2); }
};
</code></pre></div>
              <p>表格稍微复杂一些。表格访问器结构用于指向表格的序列化数据，该数据始终以指向其虚表的偏移量开始。它派生自<code>Table</code>，其中包含<code>GetField</code>辅助函数。GetField接受一个虚表偏移量和一个默认值。它将在该偏移量处查看虚表。如果偏移量超出范围（来自较旧版本的数据）或虚表条目为0，则该字段在此对象中不存在，并返回默认值。否则，它使用该条目作为指向要读取字段的表格的偏移量。</p>
              <div
                class="highlight"><pre><span></span><code>struct MonsterBuilder {
  flatbuffers::FlatBufferBuilder &amp;fbb_;
  flatbuffers::uoffset_t start_;
  void add_pos(const Vec3 *pos) { fbb_.AddStruct(4, pos); }
  void add_mana(int16_t mana) { fbb_.AddElement&lt;int16_t&gt;(6, mana, 150); }
  void add_hp(int16_t hp) { fbb_.AddElement&lt;int16_t&gt;(8, hp, 100); }
  void add_name(flatbuffers::Offset&lt;flatbuffers::String&gt; name) { fbb_.AddOffset(10, name); }
  void add_inventory(flatbuffers::Offset&lt;flatbuffers::Vector&lt;uint8_t&gt;&gt; inventory) { fbb_.AddOffset(14, inventory); }
  void add_color(int8_t color) { fbb_.AddElement&lt;int8_t&gt;(16, color, 2); }
  MonsterBuilder(flatbuffers::FlatBufferBuilder &amp;_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
  flatbuffers::Offset&lt;Monster&gt; Finish() { return flatbuffers::Offset&lt;Monster&gt;(fbb_.EndTable(start_, 7)); }
};
</code></pre></div>
              <p><code>MonsterBuilder</code>是使用<code>FlatBufferBuilder</code>构造表格的基辅助结构。您可以按任何顺序添加字段，并且<code>Finish</code>调用将确保生成正确的虚表。</p>
              <div
                class="highlight"><pre><span></span><code>inline flatbuffers::Offset&lt;Monster&gt; CreateMonster(flatbuffers::FlatBufferBuilder &amp;_fbb,
                                                  const Vec3 *pos, int16_t mana,
                                                  int16_t hp,
                                                  flatbuffers::Offset&lt;flatbuffers::String&gt; name,
                                                  flatbuffers::Offset&lt;flatbuffers::Vector&lt;uint8_t&gt;&gt; inventory,
                                                  int8_t color) {
  MonsterBuilder builder_(_fbb);
  builder_.add_inventory(inventory);
  builder_.add_name(name);
  builder_.add_pos(pos);
  builder_.add_hp(hp);
  builder_.add_mana(mana);
  builder_.add_color(color);
  return builder_.Finish();
}
</code></pre></div>
              <p><code>CreateMonster</code>是一个方便函数，它调用<code>MonsterBuilder</code>中的所有函数。请注意，如果您传递默认值作为参数，它将不会实际构造该字段，因此您可能希望使用此函数而不是构建器类，因为几乎在所有情况下都可以使用此函数。</p>
              <div
                class="highlight"><pre><span></span><code>inline const Monster *GetMonster(const void *buf) { return flatbuffers::GetRoot&lt;Monster&gt;(buf); }
</code></pre></div>
              <p>此函数仅为根表类型生成，以便能够从原始缓冲区指针开始遍历FlatBuffer。</p>
              <div
                class="highlight"><pre><span></span><code>}; // namespace MyGame
}; // namespace Sample
</code></pre></div>
              <h3 id="encoding-example">编码示例（Encoding example）</h3>
              <p>以下是与上述模式对应的JSON的示例编码：</p>
              <div
                class="highlight"><pre><span></span><code>{ pos: { x: 1, y: 2, z: 3 }, name: &quot;fred&quot;, hp: 50 }
</code></pre></div>
              <p>生成的二进制缓冲区如下：</p>
              <div
                class="highlight"><pre><span></span><code>// Start of the buffer:
uint32_t 20  // Offset to the root table.

// Start of the vtable. Not shared in this example, but could be:
uint16_t 16 // Size of table, starting from here.
uint16_t 22 // Size of object inline data.
uint16_t 4, 0, 20, 16, 0, 0  // Offsets to fields from start of (root) table, 0 for not present.

// Start of the root table:
int32_t 16     // Offset to vtable used (default negative direction)
float 1, 2, 3  // the Vec3 struct, inline.
uint32_t 8     // Offset to the name string.
int16_t 50     // hp field.
int16_t 0      // Padding for alignment.

// Start of name string:
uint32_t 4  // Length of string.
int8_t &#39;f&#39;, &#39;r&#39;, &#39;e&#39;, &#39;d&#39;, 0, 0, 0, 0  // Text + 0 termination + padding.
</code></pre></div>
              <p>请注意，这不是唯一可能的编码，因为写入器在首先写入根对象的哪些子对象方面有一定的灵活性（尽管在这种情况下只有一个字符串），以及写入字段的顺序。不同的顺序也可能导致不同的对齐发生。</p>
              <h3 id="additional-reading">附加阅读（Additional reading）</h3>
              <p>C语言实现的作者编写了一个类似的<a
                  href="https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#flatbuffers-binary-format">文档</a>，可能会进一步帮助说明该格式。</p>
              <h1 id="flexbuffers">FlexBuffers</h1>
              <p><a
                  href="../flexbuffers/index.html">无模式（schema-less）</a>版本的FlatBuffers有自己的编码，详细信息如下。</p>
              <p>它与上面提到的许多属性相同，所有数据都通过偏移量访问，所有标量都与自身大小对齐，并且所有数据始终以小端格式存储。</p>
              <p>一个不同之处是FlexBuffers是从前向后构建的，因此子元素在父元素之前存储，数据的根从最后一个字节开始。</p>
              <p>另一个不同之处是标量数据以可变位数（8/16/32/64）存储。当前宽度始终由<em>父元素</em>确定，例如，如果标量位于向量中，则向量一次性确定所有元素的位宽。为特定向量选择最小位宽是编码器自动完成的，因此通常不需要用户关注，不过了解这个特性（不要将double放在与一堆字节大小元素相同的向量中）对于效率来说是有帮助的。</p>
              <p>与FlatBuffers不同，这里只有一种偏移量类型，即无符号整数，表示从其自身地址（存储偏移量的位置）开始向负方向的字节数。</p>
              <h3 id="scalars">标量（Scalars）</h3>
              <p>FlexBuffers支持整数（<code>TYPE_INT</code>和
                <code>TYPE_UINT</code>）和浮点数
                （<code>TYPE_FLOAT</code>），上面提到的位宽都可用。它们可以存储
                为内联形式，也可以通过偏移量引用
                （<code>TYPE_INDIRECT_*</code>）。</p>
              <p>偏移量版本对于将昂贵的64位（甚至32位）数值编码
                到较小尺寸的向量/映射中很有用，也可以共享/重复一个值
                多次。</p>
              <h3 id="booleans-and-nulls">布尔值和空值（Booleans and Nulls）</h3>
              <p>布尔值（<code>TYPE_BOOL</code>）和空值
                （<code>TYPE_NULL</code>）被编码为内联无符号
                整数。</p>
              <h3 id="blobs-strings-and-keys">二进制块、字符串和键（Blobs, Strings and
                Keys）</h3>
              <p>二进制块（<code>TYPE_BLOB</code>）的编码类似于向量，
                有一个区别：元素始终是<code>uint8_t</code>。父级位宽
                仅确定大小字段的宽度，允许二进制块很大，而不需要元素
                也很大。</p>
              <p>字符串（<code>TYPE_STRING</code>）类似于二进制块，不同之处在于
                它们有一个额外的0终止字节以方便使用，并且它们必须是UTF-8编码的
                （因为在不支持指向UTF-8数据的指针的语言中的访问器可能需要
                将它们转换为本地字符串类型）。</p>
              <p>"键"（<code>TYPE_KEY</code>）类似于字符串，但不存储大小
                字段。之所以这样命名是因为它们用于映射，映射不关心
                大小，因此可以更加紧凑。与字符串不同，键不能
                包含值为0的字节作为其数据的一部分（大小只能由
                <code>strlen</code>确定），所以虽然你可以在映射上下文之外使用它们
                如果你想的话，但通常最好使用字符串。</p>
              <h3 id="maps">映射（Maps）</h3>
              <p>映射（<code>TYPE_MAP</code>）类似于（无类型）向量，但在大小字段之前有2个前缀：</p>
              <table>
                <thead>
                  <tr>
                    <th style="text-align: right;">索引</th>
                    <th style="text-align: left;">字段</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td style="text-align: right;">-3</td>
                    <td style="text-align: left;">指向键向量的偏移量（可在表之间共享）。</td>
                  </tr>
                  <tr>
                    <td style="text-align: right;">-2</td>
                    <td style="text-align: left;">键向量的字节宽度。</td>
                  </tr>
                  <tr>
                    <td style="text-align: right;">-1</td>
                    <td
                      style="text-align: left;">大小（从这里开始兼容<code>TYPE_VECTOR</code>）</td>
                  </tr>
                  <tr>
                    <td style="text-align: right;">0</td>
                    <td style="text-align: left;">元素。</td>
                  </tr>
                  <tr>
                    <td style="text-align: right;">大小</td>
                    <td style="text-align: left;">类型。</td>
                  </tr>
                </tbody>
              </table>
              <p>由于映射在其他方面与向量相同，因此可以像向量一样迭代映射（这可能比按键查找更快）。</p>
              <p>键向量是一个键的类型化向量。键和相应的值<em>必须</em>以排序顺序存储（由<code>strcmp</code>确定），以便可以使用二分查找进行查找。</p>
              <p>键向量是一个与值向量分离的结构，这样它可以在多个值向量之间共享，并且还允许在代码中将其视为自己的独立向量。</p>
              <p>一个示例映射 { foo: 13, bar: 14 } 将被编码为：</p>
              <div
                class="highlight"><pre><span></span><code>0 : uint8_t &#39;b&#39;, &#39;a&#39;, &#39;r&#39;, 0
4 : uint8_t &#39;f&#39;, &#39;o&#39;, &#39;o&#39;, 0
8 : uint8_t 2      // key vector of size 2
// key vector offset points here
9 : uint8_t 9, 6   // offsets to bar_key and foo_key
11: uint8_t 2, 1   // offset to key vector, and its byte width
13: uint8_t 2      // value vector of size
// value vector offset points here
14: uint8_t 14, 13 // values
16: uint8_t 4, 4   // types
</code></pre></div>
              <h3 id="the-root">根（The root）</h3>
              <p>如前所述，根从缓冲区的末尾开始。最后一个uint8_t是根的字节宽度（通常父级确定宽度，但根没有父级）。它前面的uint8_t是根的类型，再前面的字节是根值（由最后一个字节指定的字节数）。</p>
              <p>例如，整数值<code>13</code>作为根将是：</p>
              <div
                class="highlight"><pre><span></span><code>uint8_t 13, 4, 1    // 值、类型、根字节宽度。
</code></pre></div>
            </article>
          </div>

          <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>

          <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
        </div>

      </main>

      <footer class="md-footer">

        <nav class="md-footer__inner md-grid" aria-label="Footer">

          <a href="../white_paper/index.html"
            class="md-footer__link md-footer__link--prev"
            aria-label="Previous: White Paper">
            <div class="md-footer__button md-icon">

              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path
                  d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z" /></svg>
            </div>
            <div class="md-footer__title">
              <span class="md-footer__direction">
                Previous
              </span>
              <div class="md-ellipsis">
                White Paper
              </div>
            </div>
          </a>

          <a href="../intermediate_representation/index.html"
            class="md-footer__link md-footer__link--next"
            aria-label="Next: Intermediate Representation">
            <div class="md-footer__title">
              <span class="md-footer__direction">
                Next
              </span>
              <div class="md-ellipsis">
                Intermediate Representation
              </div>
            </div>
            <div class="md-footer__button md-icon">

              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path
                  d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z" /></svg>
            </div>
          </a>

        </nav>

        <div class="md-footer-meta md-typeset">
          <div class="md-footer-meta__inner md-grid">
            <div class="md-copyright">

              <div class="md-copyright__highlight">
                Copyright &copy; 2025 Google
              </div>

              Made with
              <a href="https://squidfunk.github.io/mkdocs-material/"
                target="_blank" rel="noopener">
                Material for MkDocs
              </a>

            </div>

            <div class="md-social">

              <a href="https://github.com/google/flatbuffers" target="_blank"
                rel="noopener" title="github.com" class="md-social__link">
                <svg xmlns="http://www.w3.org/2000/svg"
                  viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path
                    d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" /></svg>
              </a>

              <a href="https:///discord.gg/6qgKs3R" target="_blank"
                rel="noopener" title class="md-social__link">
                <svg xmlns="http://www.w3.org/2000/svg"
                  viewBox="0 0 640 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path
                    d="M524.531 69.836a1.5 1.5 0 0 0-.764-.7A485 485 0 0 0 404.081 32.03a1.82 1.82 0 0 0-1.923.91 338 338 0 0 0-14.9 30.6 447.9 447.9 0 0 0-134.426 0 310 310 0 0 0-15.135-30.6 1.89 1.89 0 0 0-1.924-.91 483.7 483.7 0 0 0-119.688 37.107 1.7 1.7 0 0 0-.788.676C39.068 183.651 18.186 294.69 28.43 404.354a2.02 2.02 0 0 0 .765 1.375 487.7 487.7 0 0 0 146.825 74.189 1.9 1.9 0 0 0 2.063-.676A348 348 0 0 0 208.12 430.4a1.86 1.86 0 0 0-1.019-2.588 321 321 0 0 1-45.868-21.853 1.885 1.885 0 0 1-.185-3.126 251 251 0 0 0 9.109-7.137 1.82 1.82 0 0 1 1.9-.256c96.229 43.917 200.41 43.917 295.5 0a1.81 1.81 0 0 1 1.924.233 235 235 0 0 0 9.132 7.16 1.884 1.884 0 0 1-.162 3.126 301.4 301.4 0 0 1-45.89 21.83 1.875 1.875 0 0 0-1 2.611 391 391 0 0 0 30.014 48.815 1.86 1.86 0 0 0 2.063.7A486 486 0 0 0 610.7 405.729a1.88 1.88 0 0 0 .765-1.352c12.264-126.783-20.532-236.912-86.934-334.541M222.491 337.58c-28.972 0-52.844-26.587-52.844-59.239s23.409-59.241 52.844-59.241c29.665 0 53.306 26.82 52.843 59.239 0 32.654-23.41 59.241-52.843 59.241m195.38 0c-28.971 0-52.843-26.587-52.843-59.239s23.409-59.241 52.843-59.241c29.667 0 53.307 26.82 52.844 59.239 0 32.654-23.177 59.241-52.844 59.241" /></svg>
              </a>

              <a href="https://twitter.com/dbaileychess" target="_blank"
                rel="noopener" title="twitter.com" class="md-social__link">
                <svg xmlns="http://www.w3.org/2000/svg"
                  viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path
                    d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8l164.9-188.5L26.8 48h145.6l100.5 132.9zm-24.8 373.8h39.1L151.1 88h-42z" /></svg>
              </a>

            </div>

          </div>
        </div>
      </footer>

    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>

    <script id="__config"
      type="application/json">{"base": "..", "features": ["content.code.annotate", "content.tabs.link", "navigation.expand", "navigation.footer", "header.autohide", "content.action.edit"], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>

    <script src="../assets/javascripts/bundle.c8b220af.min.js"></script>

  </body>

  <!-- Mirrored from flatbuffers.dev/internals/ by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 08 May 2025 07:01:36 GMT -->
</html>